package com.up360.rapidcalc.global
{
	import flash.display.LoaderInfo;
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.system.Capabilities;
	
	/**
	 * 作者:郎福涛
	 * 日期:2012-6-16 下午02:22:49
	 * 说明:应用程序配置文件管理
	 */
	public class Config
	{
		private static var _instance:Config;
		
		/**
		 * 主应用程序LoaderInfo对象引用
		 */		
		private var _loaderInfo:LoaderInfo;
		/**
		 * 本文件所在目录,不包括本文件的文件名
		 */		
		private var _thisFilesPath:String;
		/**
		 * 配置文件数据，现默认使用XML格式
		 */		
		private var _configData:XML;
		/**
		 * 应用程序版本
		 */		
		private var _version:String;
		/**
		 * 加载完成时的回调函数
		 */		
		private var _onComplete:Function;
		/**
		 * 存储域标记的对象
		 */		
		private var _domains:Object;
		
		public function Config()
		{
			
		}
		/**
		 * 初始化
		 * @param loaderInfo 应用程序LoaderInfo，parameters.commonConf为所有flash公共配置文件地址，parameters.conf为私有配置文件地址
		 * @param isLoadCommonConfigFile 是否加载外部公共配置文件,如果设为false不加载外部公用配置文件
		 * @param isLoadPrivyConfigFile 是否加载本应用程序私有配置文件
		 * @param onComplete 配置文件加载完成，无参数
		 */		
		public function initialize(loaderInfo:LoaderInfo,isLoadConfigFile:Boolean=true,onComplete:Function=null):void{
			_loaderInfo=loaderInfo;
			_onComplete=onComplete;
			
			_version=loaderInfo.parameters.v;
			//本应用程序url地址
			var b_loaderInfoURL:String=_loaderInfo.url;
			//本应用程序url地址中最后一个”/“的索引+1
			var b_index:int=b_loaderInfoURL.lastIndexOf("/")+1;
			//本应用程序所在路径
			_thisFilesPath=b_loaderInfoURL.substr(0,b_index);
			
			if(isLoadConfigFile){
				loadConfigFile();
			}else{
				callOnComplete();
			}
		}
		private function loadConfigFile():void{
			var b_configFilePath:String=_loaderInfo.parameters.conf;
			if(b_configFilePath=="" || b_configFilePath==null){
				b_configFilePath=_thisFilesPath+"RapidCalcMain.xml";
			}
			if(_version && _version!=""){
				b_configFilePath+="?v"+_version;
			}
			
			var b_urlLoader:URLLoader=new URLLoader();
			var b_request:URLRequest=new URLRequest(b_configFilePath);
			b_urlLoader.addEventListener(Event.COMPLETE,configLoadComplete);
			b_urlLoader.load(b_request);
		}
		private function configLoadComplete(e:Event):void
		{
			var b_urlLoader:URLLoader=e.currentTarget as URLLoader;
			b_urlLoader.removeEventListener(Event.COMPLETE,configLoadComplete);
			_configData=XML(b_urlLoader.data);
			
			setDomains();
			mergeDomains(_configData.file[0],true);
			mergeDomains(_configData.path[0],true);
			mergeDomains(_configData.dataInterface[0],true);
			callOnComplete();
		}
		/**
		 * 设置域对象，把域标记与域地址从XML提取到Object中
		 */		
		private function setDomains():void{
			_domains={};
			var b_domainsChildren:XMLList=_configData.domains[0].children();
			var b_len:int=b_domainsChildren.length();
			for(var i:int=0;i<b_len;i++){
				var b_domain:XML=b_domainsChildren[i];
				var b_url:String=b_domain.@url;
				if(b_url.substr(-1,1)!="/") b_url=b_url+"/";
				_domains[b_domain.name()]=b_url;
			}
		}
		/**
		 * 把xml节点中的domain和url合并
		 * @param xmlList
		 * @param checkEnd 是否检查是否以“/”结尾，如果不是则加上“/”
		 */		
		private function mergeDomains(xml:XML,checkEnd:Boolean=false):void{
			//文件路径列表
			var b_xmlChildren:XMLList=xml.children();
			
			//文件路径数量
			var b_len:int=b_xmlChildren.length();
			//把文件路径中的domain标记与url合并到url中，以方便以后使用
			for(var i:int=0;i<b_len;i++){
				var b_xml:XML=b_xmlChildren[i];
				var b_domainName:String=b_xml.@domain;
				var b_url:String=b_xml.@url;
				
				//如果结尾不是 "/" 则加上"/"
				if(checkEnd && b_url.substr(-1,1)!="/") b_url=b_url+"/";
				
				//如果域标记不为空进行处理，反之使用原始的url
				if(b_domainName!="" && b_domainName!=null){
					var b_domain:String=_domains[b_domainName];
					if(b_url.substr(0,1)=="/") b_url=b_url.substr(1);
					b_xml.@url=b_domain+b_url;
					b_xml.@domain=null;
				}
			}
		}
//		/**
//		 * 设置数据接口地址
//		 */		
//		private function setDataInterface():void{
//			//数据接口列表
//			var b_dataInterfaceChildren:XMLList=_configData.dataInterface[0].children();
//			//数据接口数量
//			var b_len:int=b_dataInterfaceChildren.length();
//			//把数据接口中的domain标记与url合并到url中，以方便以后使用
//			for(var i:int=0;i<b_len;i++){
//				var b_xml:XML=b_dataInterfaceChildren[i];
//				var b_domainName:String=b_xml.@domain;
//				var b_url:String=b_xml.@url;
//				
//				if(b_url.substr(-1,1)!="/") b_url=b_url+"/";
//				
//				//如果域标记不为空进行处理，反之使用原始的url
//				if(b_domainName!="" && b_domainName!=null){
//					var b_domain:String=_domains[b_domainName];
//					if(b_url.substr(0,1)=="/") b_url=b_url.substr(1);
//					b_xml.@url=b_domain+b_url;
//					b_xml.@domain=null;
//				}
//			}
//		}
//		/**
//		 * 设置地址
//		 */		
//		private function setPath():void{
//			//文件路径列表
//			var b_pathChildren:XMLList=_configData.path[0].children();
//			//文件路径数量
//			var b_len:int=b_pathChildren.length();
//			//把文件路径中的domain标记与url合并到url中，以方便以后使用
//			for(var i:int=0;i<b_len;i++){
//				var b_xml:XML=b_pathChildren[i];
//				var b_domainName:String=b_xml.@domain;
//				//如果域标记不为空进行处理，反之使用原始的url
//				if(b_domainName!="" && b_domainName!=null){
//					var b_domain:String=_domains[b_domainName];
//					var b_url:String=b_xml.@url;
//					if(b_url.substr(0,1)=="/") b_url=b_url.substr(1);
//					b_xml.@url=b_domain+b_url;
//					b_xml.@domain=null;
//				}
//			}
//		}
		/**
		 * 配置文件加载完成
		 */		
		private function callOnComplete():void{
			if(_onComplete!=null){
				_onComplete.call(null);
				_onComplete=null;
			}
		}
		/**
		 * 获取配置文件数据
		 */		
		public function get configData():XML{
			return _configData;
		}
		/**
		 * 本应用程序所在的路径,不包括本应用程序的文件名,如http://www.up360.cn/flash/
		 */
		public function get thisFilesPath():String{
			return _thisFilesPath;
		}
		/**
		 * 获取应用程序版本号
		 */		
		public function get version():String{
			return _version;
		}
		/**
		 * 是不是测试的
		 */		
		public function get isTest():Boolean{
			if(_configData.@test=="1"){
				return true;
			}else{
				return false;
			}
		}
		/**
		 * 获取配置文件实例
		 */		
		public static function get instance():Config{
			if(!_instance) _instance=new Config();
			return _instance;
		}
		
	}
}